package com.sparrow.rpc.manager;

import com.sparrow.rpc.domain.RpcNode;
import com.sparrow.rpc.socket.msg.req.RpcLoginRequest;
import com.sparrow.rpc.socket.msg.resp.RpcLoginResponse;
import com.sparrow.rpc.socket.session.RpcSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public abstract class AbsRpcNodeManager implements RpcNodeManager{
    private static final Logger logger = LoggerFactory.getLogger(AbsRpcNodeManager.class);
    /**
     * 节点信息
     */
    protected final Map<String, RpcNode> nodeMap = new ConcurrentHashMap<>();

    protected RpcNode self;

    public RpcNode registerNode(String id, String ip, int port) {
        RpcNode newNode = new RpcNode(id, ip, port);
        RpcNode existing = nodeMap.putIfAbsent(id, newNode);
        if (existing != null) {
            return existing; // 返回已有节点
        } else {
            logger.info("注册节点: {}", newNode);
            return newNode; // 返回新注册节点
        }
    }

    @Override
    public RpcNode getSelf() {
        return self;
    }

    /**
     * 根据节点 ID 查找节点。
     *
     * @param id 要查找的节点的 ID
     * @return 如果找到节点，返回该节点对象；否则返回 null
     */
    public RpcNode getNode(String id) {
        return nodeMap.get(id);
    }

    /**
     * 注销指定 ID 的节点。
     *
     * @param id 要注销的节点的 ID
     */
    public void unregisterNode(int id) {
        // 从节点映射中移除指定 ID 的节点
        RpcNode node = nodeMap.remove(id);
        if (node != null) {
            // 如果节点存在，使用 SLF4J 记录节点注销信息
            logger.info("成功注销节点: {}", node);
        } else {
            // 如果节点不存在，使用 SLF4J 记录未找到节点的信息
            logger.info("未找到 ID 为 {} 的节点。", id);
        }
    }

    @Override
    public void onRpcNodeLogin(RpcSession session, RpcLoginRequest nodeRequest) {
        RpcLoginResponse response = new RpcLoginResponse();
        response.setTargetNodeId(getSelf().getId());
        response.setLoginNodeId(nodeRequest.getNodeId());
        session.writeAndFlush(response);
    }
}
